package branch_and_price;

import java.util.ArrayList;
import java.util.HashMap;

public class Pool {
    private Data data;
    private ArrayList<ArrayList<Integer>> route_Pool;
    private ArrayList<Double> route_Cost;
    private ArrayList<String> route_Name;
    // 因为HashMap中的key值不能重复，可以此保证存储路径的唯一性
    private HashMap<ArrayList<Integer>, Integer> route_check_map;

    public Pool(Data d){
        this.data = d;
        route_Pool = new ArrayList<>();
        route_Cost = new ArrayList<>();
        route_Name = new ArrayList<>();
        route_check_map = new HashMap<>();
    }

    // 向路径池中添加路径，并返回此路径在路径池中的索引（如果此路径已存在于其中，返回-1）
    public int add_route(ArrayList<Integer> r){
        if (!route_check_map.containsKey(r)){
            route_Pool.add(r);
            route_Cost.add(data.cal_cost(r));
            route_Name.add(Integer.toString(route_Pool.size()-1));
            route_check_map.put(r,route_Pool.size()-1);
            return route_Pool.size()-1;
            // 如果路径池不包含之，返回新路径在路径池中的索引
        }else {
            // 如果路径池包含之，返回-1
            return -1;
        }
    }

    /**
     * test a route is in the pool or not?
     * TSP路径 r 是否在路径池中，如果在，返回其索引；否则返回-1
     */
    public int route2i(ArrayList<Integer> r){
        int rid = -1;
        if (route_check_map.containsKey(r)) {
            rid = route_check_map.get(r);
        }
        // 如果返回-1，表示此路径未出现过
        return rid;
    }

    // 打印路径
    public static void showRoute(ArrayList<Integer> r){
        // System.out.println("--------------- TSP路径 ---------------");
        for (int i = 0; i < r.size(); i++) {
            System.out.print(r.get(i)+"->");
        }
        System.out.println();
    }

    public Data getData() {
        return data;
    }

    public ArrayList<ArrayList<Integer>> getRoute_Pool() {
        return route_Pool;
    }

    public ArrayList<String> getRoute_Name() {
        return route_Name;
    }

    public ArrayList<Double> getRoute_Cost() {
        return route_Cost;
    }
}